package com.zx.idc.backend.gui.sys;


import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.zx.idc.backend.gui.common.BasicBaseApi;
import com.zx.idc.backend.gui.common.Result;
import com.zx.idc.common.util.DealObjectNullValue;
import com.zx.idc.ds.sys.entity.SysBaseCode;
import com.zx.idc.ds.sys.service.ISysBaseCodeService;
import com.zx.idc.ds.sys.vo.SysBaseCodeVo;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 基础代码 前端控制器
 * </p>
 *
 * @author rxliuli
 * @since 2019-04-09
 */
@RestController
@RequestMapping("/api/sysBaseCode")
public class SysBaseCodeController extends BasicBaseApi<ISysBaseCodeService, SysBaseCode> {

    @GetMapping("/query-page")
    @RequiresPermissions("system-configuration:sys-base-code")
    public Result<Page<SysBaseCodeVo>> page(Page<SysBaseCodeVo> page, SysBaseCodeVo sysBaseCodeVo) {
        return success(service.pageByParam(page, sysBaseCodeVo));
    }

    /**
     * 根据类型获取数据列表
     *
     * @param type
     * @return
     */
    @GetMapping("/select-list-type/{type}")
    @RequiresPermissions("system-configuration:sys-base-code")
    public Result<List<SysBaseCode>> selectListByType(@PathVariable("type") String type) {
        return success(
            service.selectList(
                new EntityWrapper<SysBaseCode>()
                    .setSqlSelect("id", "name", "parent", "code")
                    .eq("type", type)
            )
        );
    }

    /**
     * 根据id删除
     * 实际是更新delFlag字段 为 1：已删除,
     *
     * @param id
     * @return
     */
    @GetMapping("/delete/{id}")
    @RequiresPermissions("system-configuration:sys-base-code:edit")
    public Result<Boolean> del(@PathVariable("id") Long id) {
        return success(service.deleteBaseCodeById(id));
    }

    /**
     * 根据id修改状态
     *
     * @param id
     * @return
     */
    @GetMapping("/update_status/{id}")
    @RequiresPermissions("system-configuration:sys-base-code:edit")
    public Result<Boolean> updateStatus(@PathVariable("id") Long id) {
        SysBaseCode selectById = service.selectStatusById(id);
        String status = selectById.getStatus();
        status = SysBaseCode.STATUS_ENABLE.equals(status) ? SysBaseCode.STATUS_DISABLE : SysBaseCode.STATUS_ENABLE;
        SysBaseCode sysBaseCode = new SysBaseCode();
        sysBaseCode.setId(id);
        sysBaseCode.setStatus(status);
        return success(service.updateById(sysBaseCode));
    }

    @PostMapping("/update-or-add")
    @RequiresPermissions("system-configuration:sys-base-code:edit")
    public Result<Boolean> updateOrInsert(@RequestBody SysBaseCode sysBaseCode) {
        return success(service.insertOrUpdateAllColumn(DealObjectNullValue.setNullValue(sysBaseCode)));
    }

    /**
     * 通用的添加方法
     *
     * @param entity 需要添加的实体对象
     * @return 添加是否成功，需要以 {@link Result#getData()} 作为判断标准
     */
    @Override
    @RequiresPermissions("system-configuration:sys-base-code:edit")
    public Result<Boolean> add(@RequestBody SysBaseCode entity) {
        try {
            return success(service.insert(entity));
        } catch (DuplicateKeyException e) {
            log.error("基础代码新增主键重复");
            return error("键值已存在了");
        } catch (Exception e) {
            log.error("基础代码新增主键异常", e);
        }
        return success(false);
    }

    /**
     * 通用的更新方法
     *
     * @param entity 需要更新的实体对象
     * @return 更新是否成功，需要以 {@link Result#getData()} 作为判断标准
     */
    @Override
    @RequiresPermissions("system-configuration:sys-base-code:edit")
    public Result<Boolean> update(@RequestBody SysBaseCode entity) {
        try {
            return success(service.updateById(entity));
        } catch (DuplicateKeyException e) {
            log.error("基础代码修改主键重复");
            return error("键值已存在了");
        } catch (Exception e) {
            log.error("基础代码修改主键异常", e);
        }
        return success(false);
    }

    @GetMapping("/exists-by-id/{id}")
    @RequiresPermissions("system-configuration:sys-base-code")
    public Result<Boolean> existsById(@PathVariable("id") Long id) {
        return success(service.existsById(id));
    }

    @GetMapping("/exists-by-type/{type}/and-code/{code}")
    @RequiresPermissions("system-configuration:sys-base-code")
    public Result<Boolean> existsByTypeAndCode(@PathVariable("type") String type, @PathVariable("code") Integer code) {
        return success(service.selectCount(new EntityWrapper<>(new SysBaseCode().setType(type).setCode(code))) > 0);
    }
}

